﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestionePolveriLib.BL;
using GestionePolveriLib.Utilities;
using GestionePolveriLib.Facades;

namespace GestionePolveri2
{
    public partial class PartiteUC : UserControl
    {
        private List<Colore> m_colori = null;
        private PartitaInfo m_partitaInfo = null;
        private bool m_addColoriGenerici = true;

        public bool AddColoriGenerici
        {
            get { return m_addColoriGenerici; }
            set { m_addColoriGenerici = value; }
        }

        public PartitaInfo PartitaInfo
        {
            get
            {
                if (m_partitaInfo != null)
                {
                    m_partitaInfo.ColoreVerniciato = (Colore)this.cmbColori.SelectedItem;

                    m_partitaInfo.FlagConforme = !this.chkLottoConforme.Checked;

                    if (!string.IsNullOrWhiteSpace(this.txtQuantita.Text))
                    {
                        m_partitaInfo.QuantitaVerniciata = decimal.Parse(this.txtQuantita.Text);
                    }

                    m_partitaInfo.LatoA = new SpessoreVernice();
                    if (!string.IsNullOrWhiteSpace(this.txtVA1.Text)) m_partitaInfo.LatoA.Misura1 = decimal.Parse(this.txtVA1.Text);
                    if (!string.IsNullOrWhiteSpace(this.txtVA2.Text)) m_partitaInfo.LatoA.Misura2 = decimal.Parse(this.txtVA2.Text);
                    if (!string.IsNullOrWhiteSpace(this.txtVA3.Text)) m_partitaInfo.LatoA.Misura3 = decimal.Parse(this.txtVA3.Text);

                    m_partitaInfo.LatoB = new SpessoreVernice();
                    if (!string.IsNullOrWhiteSpace(this.txtVB1.Text)) m_partitaInfo.LatoB.Misura1 = decimal.Parse(this.txtVB1.Text);
                    if (!string.IsNullOrWhiteSpace(this.txtVB2.Text)) m_partitaInfo.LatoB.Misura2 = decimal.Parse(this.txtVB2.Text);
                    if (!string.IsNullOrWhiteSpace(this.txtVB3.Text)) m_partitaInfo.LatoB.Misura3 = decimal.Parse(this.txtVB3.Text);
               }

                if (m_partitaInfo.ColoreVerniciato.ID == -1)
                {
                    if (string.IsNullOrWhiteSpace(this.txtQuantita.Text))
                    {
                        if (m_partitaInfo.LatoA.Misura1 == 0)
                        {
                            m_partitaInfo = null;
                        }
                    }
                }

                return m_partitaInfo;
            }

            set 
            {
                if (m_partitaInfo == null) m_partitaInfo = new GestionePolveriLib.BL.PartitaInfo();

                m_partitaInfo = value;

                if (m_partitaInfo != null)
                {
                    SelectComboItem(this.cmbColori, m_partitaInfo.ColoreVerniciato.CodiceColore);

                    this.chkLottoConforme.Checked = (m_partitaInfo.FlagConforme ? false : true);

                    this.txtQuantita.Text = m_partitaInfo.QuantitaVerniciata.ToString();

                    this.txtVA1.Text = m_partitaInfo.LatoA.Misura1.ToString();
                    this.txtVA2.Text = m_partitaInfo.LatoA.Misura2.ToString();
                    this.txtVA3.Text = m_partitaInfo.LatoA.Misura3.ToString();

                    this.txtVB1.Text = m_partitaInfo.LatoB.Misura1.ToString();
                    this.txtVB2.Text = m_partitaInfo.LatoB.Misura2.ToString();
                    this.txtVB3.Text = m_partitaInfo.LatoB.Misura3.ToString();
                }
            }
        }

        public List<Colore> Colori
        {
            get { return m_colori; }
            set 
            { 
                m_colori = value;

                if (m_colori != null)
                {
                    if (m_colori.Count > 1)
                    {
                        // aggiungi i colori generici...
                        AddGenerici();
                    }

                    this.cmbColori.LoadData("CodiceColore", "IDColore", m_colori, new Colore() { ID = -1, CodiceColore = "Selezionare un colore..." });

                    if (m_colori.Count() == 2)
                    {
                        this.cmbColori.SelectedItem = m_colori[1];
                    }

                    if ((m_partitaInfo != null) && (m_partitaInfo.ColoreVerniciato != null))
                    {
                        SelectComboItem(this.cmbColori, m_partitaInfo.ColoreVerniciato.CodiceColore);
                    }
                }
                else
                {
                    // metti solo i colori generici...
                    ColoriFacade cf = new ColoriFacade();
                    m_colori = cf.GetGenerici();

                    if (m_colori != null)
                    {
                        this.cmbColori.LoadData("CodiceColore", "IDColore", m_colori, new Colore() { ID = -1, CodiceColore = "Selezionare un colore..." });
                    }
                }
            }
        }

        private void AddGenerici()
        {
            List<Colore> m_cgs = new List<Colore>();

            if (!AddColoriGenerici) return;

            List<int> m_famiglie = new List<int>();
            //FamigliaColoriFacade m_fcf = new FamigliaColoriFacade();
            //m_fcf.GetAll();
            foreach (Colore c in m_colori)
            {
                // prendo le famiglie interessate...
                if (!m_famiglie.Contains(c.Famiglia.ID))
                {
                    m_famiglie.Add(c.Famiglia.ID);
                }
            }

            if (m_famiglie.Count > 0)
            {
                ColoriFacade cf = new ColoriFacade();
                List<Colore> m_coloriGenerici = cf.GetGenerici();

                foreach (int id in m_famiglie)
                {
                    foreach (Colore c in m_coloriGenerici)
                    {
                        if (c.Famiglia.ID == id)
                        {
                            m_colori.Insert(0, c);
                            break;
                        }
                    }
                }
            }
        }

        private void AddGenerici__old()
        {
            List<Colore> m_cgs = new List<Colore>();

            if (!AddColoriGenerici) return;

            foreach (Colore c in m_colori)
            {
                int idFamiglia = c.Famiglia.ID;
                ColoriFacade cf = new ColoriFacade();
                List<Colore> m_coloriGenerici = cf.GetGenerico(idFamiglia);

                if (m_coloriGenerici != null)
                {
                    foreach (Colore cg in m_coloriGenerici)
                    {
                        if (!m_cgs.Contains(cg, new ColoriComparer()))
                        {
                            m_cgs.Insert(0, cg);
                        }
                    }
                }
            }

            m_colori.InsertRange(0, m_cgs);
        }

        public PartiteUC()
        {
            InitializeComponent();

            m_partitaInfo = new PartitaInfo();

            this.txtVA1.Validating += new CancelEventHandler(txtVAVB_Validating);
            this.txtVA2.Validating += new CancelEventHandler(txtVAVB_Validating);
            this.txtVA3.Validating += new CancelEventHandler(txtVAVB_Validating);
            this.txtVB1.Validating += new CancelEventHandler(txtVAVB_Validating);
            this.txtVB2.Validating += new CancelEventHandler(txtVAVB_Validating);
            this.txtVB3.Validating += new CancelEventHandler(txtVAVB_Validating);
            this.txtQuantita.Validating += new CancelEventHandler(txtVAVB_Validating);
        }

        void txtVAVB_Validating(object sender, CancelEventArgs e)
        {
            TextBox ctrl = (TextBox)sender;

            if (!string.IsNullOrWhiteSpace(ctrl.Text))
            {
                decimal distance;
                if (!decimal.TryParse(ctrl.Text, out distance))
                {
                    e.Cancel = true;

                    ctrl.BackColor = Color.Red;
                    MessageBox.Show("Sono consentiti solo valori numerici", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                else
                {
                    ctrl.BackColor = Color.White;
                }
            }
        }

        private void cmbColori_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (m_partitaInfo == null)
            {
                m_partitaInfo = new PartitaInfo();
            }
        }

        public PartitaInfo GetPartitaInfo()
        {
            PartitaInfo retValue = new PartitaInfo();

            retValue.ColoreVerniciato = (Colore)this.cmbColori.SelectedItem;

            retValue.FlagConforme = !this.chkLottoConforme.Checked;

            if (!string.IsNullOrWhiteSpace(this.txtQuantita.Text))
            {
                retValue.QuantitaVerniciata = decimal.Parse(this.txtQuantita.Text);
            }

            retValue.LatoA = new SpessoreVernice();
            if (!string.IsNullOrWhiteSpace(this.txtVA1.Text)) retValue.LatoA.Misura1 = decimal.Parse(this.txtVA1.Text);
            if (!string.IsNullOrWhiteSpace(this.txtVA2.Text)) retValue.LatoA.Misura2 = decimal.Parse(this.txtVA2.Text);
            if (!string.IsNullOrWhiteSpace(this.txtVA3.Text)) retValue.LatoA.Misura3 = decimal.Parse(this.txtVA3.Text);

            retValue.LatoB = new SpessoreVernice();
            if (!string.IsNullOrWhiteSpace(this.txtVB1.Text)) retValue.LatoB.Misura1 = decimal.Parse(this.txtVB1.Text);
            if (!string.IsNullOrWhiteSpace(this.txtVB2.Text)) retValue.LatoB.Misura2 = decimal.Parse(this.txtVB2.Text);
            if (!string.IsNullOrWhiteSpace(this.txtVB3.Text)) retValue.LatoB.Misura3 = decimal.Parse(this.txtVB3.Text);

            return retValue;
        }

        protected void SelectComboItem(ComboBox comboBox, string item)
        {
            if (comboBox.Items.Count > 0)
            {
                comboBox.SelectedIndex = comboBox.FindString(item, -1);
            }
        }
    }
}
